package memorymonitor;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MemoryObservable implements IMemoryObservable, Runnable{
    
    private ArrayList<IMemoryObserver> observadores = new ArrayList<IMemoryObserver>();
    private MemoryVO memoryBean;
    private String path;
    private static final Logger logger = Logger.getLogger(MemoryObservable.class.getName());
    private long interval = 1000;
    private boolean stop  = false;
    
    public MemoryObservable() {
        if ("linux".equalsIgnoreCase(System.getProperty("os.name"))) {
            this.path = "/";
        }
        else {
            this.path = "C:/";
        }
    }
    
    public void setPath(String path) {
        this.path = path;
    }
    
    public void addObserver(IMemoryObserver observer) {
        observadores.add(observer);
    }

    public void removeObserver(IMemoryObserver observer) {
        observadores.remove(observer);
    }
    
    public List<IMemoryObserver> getObservers() {
        return observadores;
    }

    public void notifyObservers(MemoryVO memory) {
        for(IMemoryObserver observer : observadores) {
            File unidadeSistema = new File(this.path);
            MemoryVO memoriaSistema = new MemoryVO(this.path, unidadeSistema.getFreeSpace(), unidadeSistema.getTotalSpace());
            if(memoryBean == null || !memoryBean.equals(memoriaSistema)) {
                this.memoryBean = memoriaSistema;
                observer.handleEvent(this.memoryBean);
            }                
        }            
    }

    public void run() {
        try {
            execute();                    
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
            throw new RuntimeException("Ocorreu um erro com o monitor", ex);
        }
    }
    
    public void stop() {
        this.stop = true;
    }
    
    private void execute() throws Exception {
        logger.info("O monitor está rodando ...");
        while (!stop) {
            Thread.sleep(interval);
            notifyObservers(memoryBean);
        }
    }
}